package com.br.negocio.web.backbean;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import com.br.negocio.controller.ControllerAcompanhante;
import com.br.negocio.vo.AcompanhanteVO;
import com.br.negocio.web.formbean.AcompanhanteFormBean;

@Controller("acompanhanteBackBean")
@Scope("session")
public class AcompanhanteBackBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Resource
	private ControllerAcompanhante controllerAcompanhante;
	
	private AcompanhanteFormBean acompanhanteFormBean;

	public AcompanhanteBackBean() {
		super();
		this.acompanhanteFormBean = new AcompanhanteFormBean();
	}

	public AcompanhanteFormBean getAcompanhanteFormBean() {
		return this.acompanhanteFormBean;
	}

	public void setAcompanhanteFormBean(AcompanhanteFormBean acompanhanteFormBean) {
		this.acompanhanteFormBean = acompanhanteFormBean;
	}
	
	// M�TODOS

	public void obterListaAcompanhante() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			this.acompanhanteFormBean.setListaAcompanhante(this.controllerAcompanhante.obterListaAcompanhante());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao obter a lista de acompanhantes: " + e.getMessage()));
		}
	}
	
	public void manterAcompanhante() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.acompanhanteFormBean.getAcompanhanteManter().getCodigo() == 0) {
				this.controllerAcompanhante.inserirAcompanhante(this.acompanhanteFormBean.getAcompanhanteManter());
			} else {
				this.controllerAcompanhante.atualizarAcompanhante(this.acompanhanteFormBean.getAcompanhanteManter());
			}
			this.acompanhanteFormBean.setListaAcompanhante(this.controllerAcompanhante.obterListaAcompanhante());
		} catch (Exception e) {
			context.addMessage(null , new FacesMessage("Erro ao manter o acompanhante: " + e.getMessage()));
		}
		
	}
	
	public void excluirAcompanhante() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.getAcompanhanteFormBean().getAcompanhanteManter().getCodigo() != 0) {
				this.controllerAcompanhante.removerAcompanhante(this.acompanhanteFormBean.getAcompanhanteManter());
				this.acompanhanteFormBean.setListaAcompanhante(this.controllerAcompanhante.obterListaAcompanhante());
				this.acompanhanteFormBean.setAcompanhanteManter(new AcompanhanteVO());
			}
		} catch (DataIntegrityViolationException e) {
			if (e.getCause().getClass() == ConstraintViolationException.class) {
				context.addMessage(null, new FacesMessage("Erro ao excluir o acompanhante: O acompanhante est� associado a alguma outra entidade."));
			} else {
				context.addMessage(null, new FacesMessage("Erro ao excluir o acompanhante: " + e.getMessage()));
			}
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao excluir o acompanhante: " + e.getMessage()));
		}
	}
	
	// LISTENERS
	
	public void listenerIrInserirAcompanhante(ActionEvent evento) {
		this.acompanhanteFormBean.setAcompanhanteManter(new AcompanhanteVO());
		this.acompanhanteFormBean.setIsDisabled(false);
		this.acompanhanteFormBean.setIsEditarDisabled(false);
		this.acompanhanteFormBean.setHead("Cadastrar Acompanhante");
	}
	
	public void listenerIrExcluirAcompanhante(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("acompanhanteExcluir");
		AcompanhanteVO acompanhanteVO = ((AcompanhanteVO)comp.getValue());
		
		if (acompanhanteVO != null) {
			this.acompanhanteFormBean.setAcompanhanteManter(this.controllerAcompanhante.obterAcompanhante(acompanhanteVO));
		}
		
		this.acompanhanteFormBean.setIsDisabled(true);
		this.acompanhanteFormBean.setIsEditarDisabled(true);
		this.acompanhanteFormBean.setHead("Excluir Acompanhante");
	}
	
	public void listenerIrEditarAcompanhante(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("acompanhanteEditar");
		AcompanhanteVO acompanhanteVO = ((AcompanhanteVO)comp.getValue());
		
		if (acompanhanteVO != null) {
			this.acompanhanteFormBean.setAcompanhanteManter(this.controllerAcompanhante.obterAcompanhante(acompanhanteVO));
		}
		
		this.acompanhanteFormBean.setIsDisabled(false);
		this.acompanhanteFormBean.setIsEditarDisabled(true);
		this.acompanhanteFormBean.setHead("Editar Acompanhante");
	}

}